#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
using namespace std;
/*
 * @lc app=leetcode.cn id=15 lang=cpp
 *
 * [15] 三数之和
 */

// @lc code=start
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<vector<int>> res;
        // -2 -1 1 2
        for (int i = 0; i < nums.size() - 2 && nums[i] <= 0; i++) {
            if (i == 0 || nums[i] != nums[i - 1]) {
                int l = i + 1, e = nums.size() - 1;
                while (l < e) {
                    if (nums[i] + nums[l] + nums[e] == 0) {
                        res.push_back({nums[i], nums[l], nums[e]});
                        while (l < e && nums[l] == nums[l + 1]) l++;
                        while (l < e && nums[e] == nums[e - 1]) e--;
                        l++; e--;
                    }
                    else if (nums[i] + nums[l] + nums[e] < 0) {
                        l++;
                    }
                    else e--;
                }
            }
        }
        
        return res;
    }
};
// @lc code=end

